package com.ly.cloud.utils;

import com.ly.cloud.exception.CloudException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: 电子表格导入工具类
 *               只能读取第一个sheet, excel 模板第一行是模板名称，第二行是对应的数据名称，第三行开始是数据
 *               从第三行开始读取(第一行和第二行表头不读取)
 * @author: pengshiqng
 * @date: Create in 2018/12/20
 * @return List  list里面存的就是excel的每一行记录
 */
public class ExcelUtils {

    public static List<String[]> readExcel(MultipartFile file) throws Exception{
        //电子表格类型 2003：xls   2007：xlsx
        String xls = "application/vnd.ms-excel";
        String xlsx ="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        //判断文件是否是电子表格
        String contentType = file.getContentType();
        if ( !(contentType.equalsIgnoreCase(xls) || contentType.equalsIgnoreCase(xlsx)) ){
            throw new CloudException("上传的文件有误，不是电子表格文件，请先下载模板再重新上传!");
        }

        Workbook workbook = null;
        // 2003
        if (contentType.equalsIgnoreCase(xls)){
            workbook = new HSSFWorkbook(file.getInputStream());
        }
        // 2007
        if (contentType.equalsIgnoreCase(xlsx)){
            workbook = new XSSFWorkbook(file.getInputStream());
        }
        //获得当前sheet工作表，只能读取第一个sheet
        Sheet sheet = workbook.getSheetAt(0);

        // 查询最大的列的长度(第二行)
        int maxColumn = sheet.getRow(1).getPhysicalNumberOfCells();

        List<String[]> list = new ArrayList<>();
        // 读取行
        for (int rowNum = 0; rowNum <= sheet.getLastRowNum();rowNum ++){
            //获得当前行
            Row row = sheet.getRow(rowNum);
            //String[] cellsValue = new String[row.getPhysicalNumberOfCells()] ;
            String[] cellsValue = new String[maxColumn] ;
            //读取单元格值
            for (int cellNum=0 ; cellNum < row.getPhysicalNumberOfCells(); cellNum++){
                Cell cell = row.getCell(cellNum);
                //如果是空单元格，返回空串，
                if (cell == null){
                    cellsValue[cellNum] = "" ;
                    continue;
                }
                //设置单元格格式为字符串类型的
                cell.setCellType(Cell.CELL_TYPE_STRING);
                //获取值
                cellsValue[cellNum] = cell.getStringCellValue() ;

            }
            list.add(cellsValue) ;
        }
        return list ;
    }
}
